home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / src / td01_src.lha / td_r0.1 / source / tdoold.c < prev   
Encoding:
C/C++ Source or Header  |  1999-05-16  |  26.4 KB  |  954 lines

  1. /*
  2. **      $VER: tdo.c 0.1 (17.4.99)
  3. **
  4. **      Creation date     : 11.10.1998
  5. **
  6. **      Description       :
  7. **         tdo library.
  8. **
  9. **
  10. **      Written by Stephan Bielmann
  11. **
  12. */
  13.  
  14. /*************************** Includes *******************************/
  15.  
  16. /*
  17. ** ANSI standart includes
  18. */
  19. #include <string.h>
  20. #include <math.h>
  21.  
  22. /*
  23. ** Amiga includes
  24. */
  25. #include <exec/types.h>
  26. #include <exec/memory.h>
  27. #include <dos/stdio.h>
  28.  
  29. #include <clib/dos_protos.h>
  30. #include <clib/alib_stdio_protos.h>
  31.  
  32. #include <pragma/exec_lib.h>
  33.  
  34. /*
  35. ** Project includes
  36. */
  37. #include "tdo_private.h"
  38. #include "compiler.h"
  39. #include "pragma/s3_lib.h"
  40.  
  41. /********************** Private constants ***************************/
  42.  
  43. /*
  44. ** The constant supported file format arrays
  45. */
  46.  
  47. //dummi hummi
  48. static ULONG c3dFFIDs [] = { 0 };
  49.  
  50. static STRPTR  c3dFFLib [] = {
  51.     "dxf.library",
  52.     NULL
  53. };
  54.  
  55. static STRPTR c3dFFNames [] = {
  56.     "AutoCAD DXF",
  57.     NULL
  58. };
  59.  
  60. static STRPTR c3dFFExtensions [] = {
  61.     "dxf",
  62.     NULL
  63. };
  64.  
  65. static ULONG  c2dFFIDs   [] = {
  66.     T2DFEPS,
  67.     0
  68. };
  69.  
  70. static STRPTR c2dFFNames [] = {
  71.     "Encapsulated PostScript",
  72.     NULL
  73. };
  74.  
  75. static STRPTR c2dFFExtensions [] = {
  76.     "eps",
  77.     NULL
  78. };
  79.  
  80.  
  81. /*
  82. ** The constant supported drawing mode arrays
  83. */
  84. static ULONG  cDMIDs   [] = {
  85.     TDMPOINTS,
  86.     TDMWIREBW,
  87.     TDMWIREGR,
  88.     TDMWIRECL,
  89.     TDMHIDDBW,
  90.     TDMHIDDGR,
  91.     TDMHIDDCL,
  92.     TDMSURFBW,
  93.     TDMSURFGR,
  94.     TDMSURFCL,
  95.     0
  96. };
  97.  
  98. static STRPTR  cDMNames   [] = {
  99.     "Points, black and white",
  100.     "Wireframe, black and white",
  101.     "Wireframe, gray scales",
  102.     "Wireframe, colors",
  103.     "Hidden line, black and white",
  104.     "Hidden line, gray scales",
  105.     "Hidden line, colors",
  106.     "Surface, black and white",
  107.     "Surface, gray scales",
  108.     "Surface, colors",
  109.     NULL
  110. };
  111.  
  112. /*
  113. ** Definition of PI
  114. */
  115. #define PI 3.14159265359
  116.  
  117. /********************** Global variables ****************************/
  118.  
  119. struct s3Base *s3Base = NULL;
  120.  
  121. /********************** Private functions ***************************/
  122.  
  123. /********************************************************************\
  124. *                                                                    *
  125. * Name         : hash                                                *
  126. *                                                                    *
  127. * Description  : Calculates the hashcode of a vertex.                *
  128. *                                                                    *
  129. * Arguments    : vertex IN : The vertex to hash.                     *
  130. *                                                                    *
  131. * Return Value : hashcode                                            *
  132. *                                                                    *
  133. * Comment      :                                                     *
  134. *                                                                    *
  135. \********************************************************************/
  136. static ULONG hash(TTDOVertex vertex) {
  137.     DOUBLE  hx = vertex.x*12.3;
  138.     DOUBLE  hy = vertex.y*23.4;
  139.     DOUBLE  hz = vertex.z*34.5;
  140.  
  141.     return (((ULONG) (pow(hx*hx + hy*hy + hz*hz,0.5) * 9.87)) % HASHSIZE);
  142. }
  143.  
  144. /********************************************************************\
  145. *                                                                    *
  146. * Name         : addVertex                                           *
  147. *                                                                    *
  148. * Description  : Adds the vertex to the mesh, if not already in its  *
  149. *                internal list. And returns the pointer to it.       *
  150. *                The vertex will be transformed according the mehs   *
  151. *                its CTM.
  152. *                                                                    *
  153. * Arguments    : mesh   IN : Pointer to the mesh.                    *
  154. *                vertex IN : The vertex to add.                      *
  155. *                                                                    *
  156. * Return Value : Pointer to the "new" vertex or NULL if no more      *
  157. *                memory is available.                                *
  158. *                                                                    *
  159. * Comment      :                                                     *
  160. *                                                                    *
  161. \********************************************************************/
  162. static TTDOVertexNode *addVertex(TTDOMesh *mesh,
  163.                                  TTDOVertex vertex) {
  164.  
  165.     ULONG    hashcode;
  166.     TTDOHashsVerticesNode    *hlvindex=NULL;
  167.     TTDOVertexNode            *ver=NULL;
  168.     TTDOCTM                ctm;
  169.     TTDOVertex             rvertex;
  170.  
  171.     ctm=mesh->ctm;
  172.  
  173.     /*
  174.     ** Transforming the the vertex according the CTM
  175.     */
  176.     // Scaling
  177.     vertex.x*=ctm.sx,vertex.y*=ctm.sy,vertex.z*=ctm.sz;
  178.  
  179.     //Rotation and translation
  180.     rvertex.x=ctm.m[0][0]*vertex.x+ctm.m[1][0]*vertex.y+ctm.m[2][0]*vertex.z+ctm.m[3][0]; 
  181.     rvertex.y=ctm.m[0][1]*vertex.x+ctm.m[1][1]*vertex.y+ctm.m[2][1]*vertex.z+ctm.m[3][1]; 
  182.     rvertex.z=ctm.m[0][2]*vertex.x+ctm.m[1][2]*vertex.y+ctm.m[2][2]*vertex.z+ctm.m[3][2]; 
  183.  
  184.     // initialize the hashcode
  185.     hashcode=hash(rvertex);
  186.  
  187.     /*
  188.     ** Check if the vertex is already in our internal list
  189.     */
  190.     hlvindex=mesh->hashTable[hashcode];
  191.     while(hlvindex!=NULL)
  192.     {
  193.           ver=hlvindex->vertexNode;
  194.  
  195.         if(rvertex.x==ver->vertex.x &&
  196.            rvertex.y==ver->vertex.y &&
  197.            rvertex.z==ver->vertex.z ) {
  198.             /*
  199.             ** Yes, return its pointer
  200.             */
  201.             return (ver);
  202.         }
  203.         hlvindex=hlvindex->next;
  204.     }
  205.     
  206.     /*
  207.     ** No it was not. Add a new one to the list and hash and return it
  208.     */
  209.     ver = AllocPooled(mesh->vertexpool,sizeof(TTDOVertexNode));
  210.     if (ver==NULL) return(NULL);
  211.     
  212.     /* The index begins at 1 ! */
  213.     mesh->vertices.numberOfVertices++;            /* increment the list counter */
  214.     ver->index=mesh->vertices.numberOfVertices;    /* Set the index */
  215.     ver->vertex = rvertex;
  216.     ver->next=NULL;
  217.  
  218.     if(mesh->vertices.firstNode!=NULL) {   /* Check if this is the first vertex to insert or not */
  219.         mesh->vertices.lastNode->next=ver;
  220.         mesh->vertices.lastNode=ver;
  221.     }
  222.     else {
  223.         mesh->vertices.lastNode=ver;
  224.         mesh->vertices.firstNode=ver;
  225.     }
  226.  
  227.     /*
  228.     ** Recalculate the bounding box
  229.     */
  230.     if(rvertex.x<mesh->bBox.left)   mesh->bBox.left=rvertex.x;
  231.     if(rvertex.x>mesh->bBox.right)  mesh->bBox.right=rvertex.x;
  232.     if(rvertex.y<mesh->bBox.rear)   mesh->bBox.rear=rvertex.y;
  233.     if(rvertex.y>mesh->bBox.front)  mesh->bBox.front=rvertex.y;
  234.     if(rvertex.z<mesh->bBox.bottom) mesh->bBox.bottom=rvertex.z;
  235.     if(rvertex.z>mesh->bBox.top)    mesh->bBox.top=rvertex.z;
  236.     
  237.     /*
  238.     ** Add the vertex to the hash table
  239.     */
  240.     hlvindex = AllocMem(sizeof(TTDOHashsVerticesNode),MEMF_FAST);
  241.     if (hlvindex==NULL) {
  242.         FreePooled(mesh->vertexpool,ver,sizeof(TTDOVertexNode));
  243.         return(NULL);
  244.     }
  245.     
  246.     hlvindex->vertexNode=ver;
  247.     hlvindex->next=mesh->hashTable[hashcode];
  248.     mesh->hashTable[hashcode]=hlvindex;
  249.     
  250.     return(ver);
  251. }
  252.  
  253. /********************************************************************\
  254. *                                                                    *
  255. * Name         : getVertex                                           *
  256. *                                                                    *
  257. * Description  : Search a vertex in the list with its index.         *
  258. *                                                                    *
  259. * Arguments    : mesh   IN : Pointer to the mesh.                    *
  260. *                index  IN : The vertex its index.                   *
  261. *                                                                    *
  262. * Return Value : Pointer to the vertex or NULL if not found.         *
  263. *                                                                    *
  264. * Comment      :                                                     *
  265. *                                                                    *
  266. \********************************************************************/
  267. static TTDOVertexNode *getVertex(TTDOMesh *mesh,
  268.                                 ULONG index) {
  269.  
  270.     TTDOVertexNode            *ver=NULL;
  271.  
  272.     if(index==0) return(NULL);
  273.  
  274.     ver=mesh->vertices.firstNode;
  275.     while(ver!=NULL && ver->index!=index) {
  276.         ver=ver->next;
  277.     }
  278.  
  279.     return(ver);
  280. }
  281.  
  282. /********************************************************************\
  283. *                                                                    *
  284. * Name         : getVertexIndex                                      *
  285. *                                                                    *
  286. * Description  : Search the index of a vertex in the list with its   *
  287. *                coordinates.                                        *
  288. *                                                                    *
  289. * Arguments    : mesh   IN : Pointer to the mesh.                    *
  290. *                vertex IN : The vertex to search for.               *
  291. *                                                                    *
  292. * Return Value : Index to the vertex or 0 if not found.              *
  293. *                                                                    *
  294. * Comment      :                                                     *
  295. *                                                                    *
  296. \********************************************************************/
  297. static ULONG getVertexIndex(TTDOMesh *mesh,
  298.                             TTDOVertex vertex) {
  299.  
  300.     ULONG    hashcode        =hash(vertex);
  301.     TTDOHashsVerticesNode    *hlvindex=NULL;
  302.     TTDOVertexNode            *ver=NULL;
  303.  
  304.     /*
  305.     ** Check if the vertex is already in our internal list
  306.     */
  307.     hlvindex=mesh->hashTable[hashcode];
  308.     while(hlvindex!=NULL)
  309.     {
  310.           ver=hlvindex->vertexNode;
  311.  
  312.         if(vertex.x==ver->vertex.x &&
  313.            vertex.y==ver->vertex.y &&
  314.            vertex.z==ver->vertex.z ) {
  315.             /*
  316.             ** Yes, return its index
  317.             */
  318.             return (ver->index);
  319.         }
  320.         hlvindex=hlvindex->next;
  321.     }
  322.     
  323.     /*
  324.     ** No it was not.
  325.     */
  326.     return(0);
  327. }
  328.  
  329. /********************************************************************\
  330. *                                                                    *
  331. * Name         : getMaterialNode                                     *
  332. *                                                                    *
  333. * Description  : Search the material its node with its index, in     *
  334. *                the given mesh. If the index=0 or not valid, NULL   *
  335. *                will be returned.                                   *
  336. *                                                                    *
  337. * Arguments    : mesh          IN : Pointer to the mesh.             *
  338. *                materialindex IN : Material index.                  *
  339. *                                                                    *
  340. * Return Value : Pointer to the material or NULL if not found.       *
  341. *                                                                    *
  342. * Comment      :                                                     *
  343. *                                                                    *
  344. \********************************************************************/
  345. static TTDOMaterialNode *getMaterialNode(TTDOMesh *mesh, ULONG materialindex) {
  346.     TTDOMaterialNode    *mindex=NULL;
  347.     
  348.     if(materialindex==0 || materialindex>mesh->materials.numberOfMaterials) return(NULL);
  349.     
  350.     /*
  351.     ** Search the material
  352.     */
  353.     mindex=mesh->materials.firstNode;
  354.     while(mindex!=NULL) {
  355.         if(mindex->index==materialindex) return(mindex);
  356.         
  357.         mindex=mindex->next;
  358.     }
  359.  
  360.     /*
  361.     ** Not found
  362.     */    
  363.     return(NULL);
  364. }
  365.  
  366. /********************************************************************\
  367. *                                                                    *
  368. * Name         : setCameraLight                                      *
  369. *                                                                    *
  370. * Description  : Sets the default position of the camera and the     *
  371. *                light and the camera its view point and the color   *
  372. *                of the light source.                                *
  373. *                                                                    *
  374. * Arguments    : mesh      IN/OUT : Pointer to the mesh.             *
  375. *                                                                    *
  376. * Comment      :                                                     *
  377. *                                                                    *
  378. \********************************************************************/
  379. static VOID setCameraLight(TTDOMesh *mesh) {
  380.     TTDOVertex ver1;
  381.         
  382.     if (mesh==NULL) return;
  383.  
  384.     /* camera its look at position */
  385.     mesh->camera.lookat.x = (mesh->bBox.left + mesh->bBox.right) / 2;
  386.     mesh->camera.lookat.y = (mesh->bBox.front + mesh->bBox.rear) / 2;
  387.     mesh->camera.lookat.z = (mesh->bBox.top + mesh->bBox.bottom) / 2;
  388.     
  389.     /* direction vector */
  390.     ver1.x = mesh->bBox.right - mesh->camera.lookat.x;
  391.     ver1.y = mesh->bBox.front - mesh->camera.lookat.y;
  392.     ver1.z = mesh->bBox.top - mesh->camera.lookat.z;
  393.     
  394.     ver1.x*=2.5;
  395.     ver1.y*=2.5;    
  396.     ver1.z*=2.5;
  397.     
  398.     /* camera its position */
  399.     mesh->camera.position.x = ver1.x + mesh->camera.lookat.x;
  400.     mesh->camera.position.y = ver1.y + mesh->camera.lookat.y;
  401.     mesh->camera.position.z = ver1.z + mesh->camera.lookat.z;
  402.  
  403.     /* light source its position */
  404.     mesh->light.position.x = ver1.x + mesh->camera.lookat.x;
  405.     mesh->light.position.y = ver1.x + mesh->camera.lookat.x;
  406.     mesh->light.position.z = ver1.x + mesh->camera.lookat.x;
  407.     
  408.     /* light source its color */
  409.     mesh->light.color.r=255;
  410.     mesh->light.color.g=255;
  411.     mesh->light.color.b=255;
  412. }
  413.  
  414. /********************************************************************\
  415. *                                                                    *
  416. * Name         : mul33Matrix                                         *
  417. *                                                                    *
  418. * Description  : Multiplicates two 3x3 matrix structures.            *
  419. *                                                                    *
  420. * Arguments    : m1  IN/OUT : The first matrix, contains the result  *
  421. *                m2  IN     : The second matrix.                     *
  422. *                                                                    *
  423. * Comment      :                                                     *
  424. *                                                                    *
  425. \********************************************************************/
  426. void mulMatrix (double m1[3][3], double m2[3][3]) {
  427.     double m[3][3];
  428.     int x,y,yy;
  429.  
  430.     for(x=0;x<3;x++) {
  431.         for(y=0;y<3;y++) {
  432.             m[x][y]=0;
  433.         }
  434.     }
  435.  
  436.     for(x=0;x<3;x++) {
  437.         for(y=0;y<3;y++) {
  438.             for(yy=0;yy<3;yy++) {
  439.                 m[x][y]+=m1[yy][y]*m2[x][yy];
  440.             }
  441.         }
  442.     }
  443.  
  444.     m1[0][0]=m[0][0];
  445.     m1[1][0]=m[1][0];
  446.     m1[2][0]=m[2][0];
  447.     m1[0][1]=m[0][1];
  448.     m1[1][1]=m[1][1];
  449.     m1[2][1]=m[2][1];
  450.     m1[0][2]=m[0][2];
  451.     m1[1][2]=m[1][2];
  452.     m1[2][2]=m[2][2];
  453. }
  454.  
  455. /********************** Public functions ****************************/
  456.  
  457. /****** tdo.library/tdo2DFileFormatNamesGet ******************************************
  458. *   NAME    
  459. *     tdo2DFileFormatNamesGet -- Get a name list of all supported 2D file formats.
  460. *   SYNOPSIS
  461. *    list = tdo2DFileFormatNamesGet(  )
  462. *
  463. *    STRPTR * tdo2DFileFormatNamesGet
  464. *         (  );
  465. *
  466. *   FUNCTION
  467. *    You will get a pointer to the namelist of all supported 2D file formats.
  468. *    This strings are READ_ONLY and only valid as long as the library is opened.
  469. *
  470. *    The list is sorted alphabetically.
  471. *
  472. *    The resulting pointer can directly be used to fill up cycle or list gadgets
  473. *    for example.
  474. *   INPUTS
  475. *    
  476. *   RESULT
  477. *     list - A NULL terminated array of string pointers. Or NULL if no
  478. *           files are supported.
  479. *
  480. *   EXAMPLE
  481. *    list = tdo2DFileFormatNamesGet();
  482. *
  483. *   NOTES
  484. *
  485. *   BUGS
  486. *   SEE ALSO
  487. *     tdo2DFileFormatIDGet(),tdo2DFileFormatExtensionGet()
  488. *    tdo2DFileFormatNumberOfGet()
  489. ******************************************************************************
  490. *
  491. */
  492. STRPTR * __saveds ASM tdo2DFileFormatNamesGet() {
  493.     if(c2dFFNames[0]!=NULL) return(c2dFFNames);
  494.     return(NULL);
  495. }
  496.  
  497. /****** tdo.library/tdo2DFileFormatIDGet ******************************************
  498. *   NAME    
  499. *     tdo2DFileFormatIDGet -- Get the ID of a specific 2D file format.
  500. *   SYNOPSIS
  501. *    id = tdo2DFileFormatIDGet( ffname )
  502. *                               D1
  503. *
  504. *    ULONG tdo2DFileFormatIDGet
  505. *         ( STRPTR );
  506. *
  507. *   FUNCTION
  508. *    You will get the ID of the 2D file format of which you passed its name.
  509. *   INPUTS
  510. *    ffname - Name of the format you search the ID for.
  511. *    
  512. *   RESULT
  513. *     id - The ID of the 2D file format or 0 if not found/supported.
  514. *
  515. *   EXAMPLE
  516. *    id = tdo2DFileFormatIDGet("PostScript");
  517. *
  518. *   NOTES
  519. *    Even if the values of the IDs wont change in future versions, it is
  520. *    recomended to show the list of all names to the user and let him choose
  521. *    the format. With the help of this function you will get the correct
  522. *    ID which is needed for further function calls.
  523. *
  524. *   BUGS
  525. *   SEE ALSO
  526. *     tdo2DFileFormatNamesGet(),tdo2DFileFormatExtensionGet()
  527. *    tdo2DFileFormatNumberOfGet()
  528. ******************************************************************************
  529. *
  530. */
  531. ULONG __saveds ASM tdo2DFileFormatIDGet(register __d1 STRPTR ffname) {
  532.     ULONG i;
  533.     STRPTR mffname=NULL;
  534.  
  535.     // make a copy of ffname, d1 is a scratch register
  536.     mffname=ffname;
  537.  
  538.     i=0;
  539.     while(strcmp(c2dFFNames[i],mffname) && c2dFFNames[i]!=NULL) {i++};
  540.     
  541.     // check if we got it or not
  542.     if(!strcmp(c2dFFNames[i],mffname)) return(c2dFFIDs[i]);
  543.     else return(0);
  544. }
  545.  
  546. /****** tdo.library/tdo2DFileFormatExtensionGet ******************************************
  547. *   NAME    
  548. *     tdo2DFileFormatExtensionGet -- Get the file extension of a specific 2D file format.
  549. *   SYNOPSIS
  550. *    ext = tdo2DFileFormatExtensionGet( ffid )
  551. *                                       D1
  552. *
  553. *    STRPTR tdo2DFileFormatExtensionGet
  554. *         ( ULONG );
  555. *
  556. *   FUNCTION
  557. *    You will get a pointer to the extension of the specified 2D file format.
  558. *    This strings are READ_ONLY and only valid as long as the library is opened.
  559. *   INPUTS
  560. *    ffid - ID of the format you search the extension for.
  561. *    
  562. *   RESULT
  563. *     ext - Pointer to the file extension string or NULL if the format is unknown.
  564. *
  565. *   EXAMPLE
  566. *    ext = tdo2DFileFormatExtensionGet(id);
  567. *
  568. *   NOTES
  569. *    This extensions are proposals of the format creators, but you are free
  570. *    to use them.
  571. *
  572. *   BUGS
  573. *   SEE ALSO
  574. *     tdo2DFileFormatNamesGet(),tdo2DFileFormatIDGet()
  575. *    tdo2DFileFormatNumberOfGet()
  576. ******************************************************************************
  577. *
  578. */
  579. STRPTR __saveds ASM tdo2DFileFormatExtensionGet(register __d1 ULONG ffid) {
  580.     ULONG i,mffid;
  581.  
  582.     // make a copy of ffid, d1 is a scratch register
  583.     mffid=ffid;
  584.     
  585.     i=0;
  586.     while(c2dFFIDs[i]!=mffid && c2dFFIDs[i]!=0) {i++};
  587.     
  588.     // check if we got it or not
  589.     if(c2dFFIDs[i]==mffid) return(c2dFFExtensions[i]);
  590.     else return(NULL);
  591. }
  592.  
  593. /****** tdo.library/tdo2DFileFormatNumberOfGet ******************************************
  594. *   NAME    
  595. *     tdo2DFileFormatNumberOfGet -- Get the number of supported 2D file formats.
  596. *   SYNOPSIS
  597. *    number = tdo2DFileFormatNumberOfGet( )
  598. *
  599. *    ULONG tdo2DFileFormatNumberOfGet
  600. *         ( );
  601. *
  602. *   FUNCTION
  603. *    You will get the number of supported 2D file formats of this library version.
  604. *   INPUTS
  605. *    
  606. *   RESULT
  607. *     number - Number of supported file formats or 0 if none.
  608. *
  609. *   EXAMPLE
  610. *    number = tdo2DFileFormatNumberOfGet();
  611. *
  612. *   NOTES
  613. *
  614. *   BUGS
  615. *   SEE ALSO
  616. *     tdo2DFileFormatNamesGet(),tdo2DFileFormatIDGet()
  617. *    tdo2DFileFormatNumberExtensionGet()
  618. ******************************************************************************
  619. *
  620. */
  621. ULONG __saveds ASM tdo2DFileFormatNumberOfGet() {
  622.     ULONG  i;
  623.     STRPTR *sIndex=NULL;
  624.  
  625.     i=0;
  626.     sIndex=c2dFFNames;
  627.     while (sIndex[i]!=NULL) i++;
  628.     
  629.     return(i);
  630. }
  631.  
  632. /****** tdo.library/tdoMeshSave2D ******************************************
  633. *   NAME    
  634. *     tdoMeshSave2D -- Saves the mesh as 2D file.
  635. *
  636. *   SYNOPSIS
  637. *    error = tdoMeshSave2D( meshhandle,id,filename,parameters )
  638. *                           D1         D2 D3        A0
  639. *
  640. *    ULONG tdoMeshSave2D
  641. *         ( ULONG,ULONG,STRPTR,T2DParams );
  642. *
  643. *   FUNCTION
  644. *    The mesh, this means vertices, polygons, materials, camera and light will
  645. *    be used to generate and save a 2D file from a specific view point and
  646. *    drawing mode in a given size.
  647. *   INPUTS
  648. *     meshhandle  - A valid handle of a mesh.
  649. *    id          - A valid 2D file format id, to specify the output format.
  650. *    filename    - Name and path of the file.
  651. *    parameters  - A 2D parameter sructure containing additional information.
  652. *    
  653. *   RESULT
  654. *    error - RCNOERROR         if all went well.
  655. *            RCNOMESH          if the handle is not valid.
  656. *            RCUNKNOWNFTYPE    if the id is not known.
  657. *            RCUNKNOWNDMODE    if the view mode in not known.
  658. *            RCNOPOLYGON       if there are no polygons to save.
  659. *            RCCHGBUF          if an error occured to allocate the save buffer.
  660. *            RCWRITEDATA       if an error occured while writing data, no more space...
  661. *            RCVERTEXOVERFLOW  if the format does not support as much vertices.
  662. *            RCNOWIDTH         if the width is 0.
  663. *            RCNOHEIGHT        if the height is 0.
  664. *            IoErr()           if possible to catch it, you will get its codes.
  665. *
  666. *   EXAMPLE
  667. *    error = tdoMeshSave2D(meshhandle,id,"ram:test",myparams);
  668. *
  669. *   NOTES
  670. *    No file existence tests are made here! Existent files will be overwritten.
  671. *
  672. *   BUGS
  673. *   SEE ALSO
  674. *     tdo2DFileFormatIDGet(),tdoDrawModeGet(),tdoMeshSave3D()
  675. ******************************************************************************
  676. *
  677. */
  678. ULONG __saveds ASM tdoMeshSave2D(register __d1 ULONG meshhandle,
  679.                                     register __d2 ULONG id,
  680.                                     register __d3 STRPTR filename,
  681.                                     register __a0 T2DParams *parameters) {
  682.     TTDOMesh        *mesh;
  683.     BPTR            filehandle=NULL;
  684.     ULONG            retcode=RCNOERROR;
  685.     UBYTE            i;
  686.     T2DParams        *mparams=NULL;
  687.     
  688.     // make a copy of the parameters, a0 is a scratch register
  689.     mparams=parameters;
  690.  
  691.     mesh = (TTDOMesh *) meshhandle;
  692.     if(mesh==NULL) return(RCNOMESH);    
  693.  
  694.       /*
  695.       ** If there are no polygons, so leave
  696.       */
  697.     if(mesh->polygons.firstNode==NULL) return(RCNOPOLYGON);
  698.     
  699.     /*
  700.     ** Check if the filetype is valid
  701.     */
  702.     i=0;
  703.     while(c2dFFIDs[i]!=id && c2dFFIDs[i]!=0) {i++};
  704.     if(c2dFFIDs[i]!=id || id==0) return(RCUNKNOWNFTYPE);
  705.     
  706.     /*
  707.     ** Check if the viewtype is valid
  708.     */
  709.     if(!(mparams->viewtype==TVWTOP ||
  710.         mparams->viewtype==TVWBOTTOM ||
  711.         mparams->viewtype==TVWLEFT ||
  712.         mparams->viewtype==TVWRIGHT ||
  713.         mparams->viewtype==TVWFRONT ||
  714.         mparams->viewtype==TVWREAR ||
  715.         mparams->viewtype==TVWPERSP ||
  716.         mparams->viewtype==TVW4SIDES)) return(RCUNKNOWNVTYPE);
  717.  
  718.     /*
  719.     ** Check if the drawmode is valid
  720.     */
  721.     i=0;
  722.     while(cDMIDs[i]!=mparams->drawmode && cDMIDs[i]!=0) {i++};
  723.     if(cDMIDs[i]!=mparams->drawmode || mparams->drawmode==0) return(RCUNKNOWNDMODE);
  724.     
  725.     /*
  726.     ** Check if the width is set
  727.     */
  728.     if (mparams->width==0) {
  729.         return(RCNOWIDTH);
  730.     }
  731.  
  732.     /*
  733.     ** Check if the height is set
  734.     */
  735.     if (mparams->height==0) {
  736.         return(RCNOHEIGHT);
  737.     }
  738.  
  739.     /*
  740.     ** If no camera and light position was given, set it to default now
  741.     */
  742.     if (!(mesh->camera.position.x &&
  743.          mesh->camera.position.y &&
  744.          mesh->camera.position.z &&
  745.          mesh->camera.lookat.x &&
  746.          mesh->camera.lookat.y &&
  747.          mesh->camera.lookat.z &&
  748.          mesh->light.position.x &&
  749.          mesh->light.position.y &&
  750.          mesh->light.position.z)) setCameraLight(mesh);
  751.  
  752.     /*
  753.     ** Open the file 
  754.     */
  755.     /* Open the file for text output */
  756.     if((filehandle=Open(filename,MODE_NEWFILE))==NULL) return(IoErr());
  757.  
  758.     /* Change the buffer size of the filehandle to 10k */
  759.     if (SetVBuf(filehandle,NULL,BUF_FULL,10000)!=DOSFALSE) {
  760.         Close(filehandle);
  761.         return(RCCHGBUF);
  762.     }
  763.  
  764.     /*
  765.     ** Write the mesh
  766.     */
  767.     switch(id) {
  768.         case T2DFEPS :
  769. //            retcode = write2EPS(filehandle,mesh,mparams->viewtype,mparams->drawmode,mparams->width,mparams->height);
  770.             break;        
  771.     }
  772.     
  773.     /*
  774.     ** Close the file
  775.     */
  776.     Close(filehandle);
  777.     
  778.     return(retcode);
  779. }
  780.  
  781. /****** tdo.library/tdoDrawModeNamesGet ******************************************
  782. *   NAME 
  783. *        tdoDrawModeNamesGet -- Get a name list of all supported drawing modes.
  784. *   SYNOPSIS
  785. *        list = tdoDrawModeNamesGet(  )
  786. *
  787. *        STRPTR * tdoDrawModeNamesGet
  788. *             (  );
  789. *
  790. *   FUNCTION
  791. *        You will get a pointer to the namelist of all supported drawing modes.
  792. *        This strings are READ_ONLY and only valid as long as the library is opened.
  793. *
  794. *        The resulting pointer can directly be used to fill up cycle or list gadgets
  795. *        for example.
  796. *
  797. *   INPUTS
  798. *        
  799. *   RESULT
  800. *        list - A NULL terminated array of string pointers. Or NULL if no
  801. *               modes are supported.
  802. *
  803. *   EXAMPLE
  804. *        list = tdoDrawModeNamesGet();
  805. *
  806. *   NOTES
  807. *
  808. *   BUGS
  809. *   SEE ALSO
  810. *        tdoDrawModeIDGet(),tdoDrawModeNumberOfGet()
  811. ******************************************************************************
  812. *
  813. */
  814. STRPTR * __saveds ASM tdoDrawModeNamesGet() {
  815.     if(cDMNames[0]!=NULL) return(cDMNames);
  816.     return(NULL);
  817. }
  818.  
  819. /****** tdo.library/tdoDrawModeIDGet ******************************************
  820. *   NAME 
  821. *        tdoDrawModeIDGet -- Get the ID of a specific drawing mode.
  822. *   SYNOPSIS
  823. *        id = tdoDrawModeIDGet( dmname )
  824. *                               D1
  825. *
  826. *        ULONG tdoDrawModeIDGet
  827. *             ( STRPTR );
  828. *
  829. *   FUNCTION
  830. *        You will get the ID of the drawing mode of which you passed its name.
  831. *   INPUTS
  832. *        dm - Name of the drawing mode you search the ID for.
  833. *        
  834. *   RESULT
  835. *        id - The ID of the drawing mode or 0 if not found/supported.
  836. *
  837. *   EXAMPLE
  838. *        id = tdoDrawModeIDGet("Points");
  839. *
  840. *   NOTES
  841. *        Even if the values of the IDs wont change in future versions, it is
  842. *        recomended to show the list of all names to the user and let him choose
  843. *        the format. With the help of this function you will get the correct
  844. *        ID which is needed for further function calls.
  845. *
  846. *   BUGS
  847. *   SEE ALSO
  848. *        tdoDrawModeNamesGet(),tdoDrawModeNumberOfGet()
  849. ******************************************************************************
  850. *
  851. */
  852. ULONG __saveds ASM tdoDrawModeIDGet(register __d1 STRPTR ffname) {
  853.     ULONG i;
  854.     STRPTR mffname=NULL;
  855.  
  856.     // make a copy of ffname, d1 is a scratch register
  857.     mffname=ffname;
  858.  
  859.     i=0;
  860.     while(strcmp(cDMNames[i],mffname) && cDMNames[i]!=NULL) {i++};
  861.     
  862.     // check if we got it or not
  863.     if(!strcmp(cDMNames[i],mffname)) return(cDMIDs[i]);
  864.     else return(0);
  865. }
  866.  
  867. /****** tdo.library/tdoDrawModeNumberOfGet ******************************************
  868. *   NAME 
  869. *        tdoDrawModeNumberOfGet -- Get the number of supported drawing modes.
  870. *   SYNOPSIS
  871. *        number = tdoDrawModeNumberOfGet( )
  872. *
  873. *        ULONG tdoDrawModeNumberOfGet
  874. *             ( );
  875. *
  876. *   FUNCTION
  877. *        You will get the number of supported drawing modes of this library version.
  878. *   INPUTS
  879. *        
  880. *   RESULT
  881. *        number - Number of supported drawing modes or 0 if none.
  882. *
  883. *   EXAMPLE
  884. *        number = tdoDrawModeNumberOfGet();
  885. *
  886. *   NOTES
  887. *
  888. *   BUGS
  889. *   SEE ALSO
  890. *        tdoDrawModeNamesGet(),tdoDrawModeIDGet()
  891. ******************************************************************************
  892. *
  893. */
  894. ULONG __saveds ASM tdoDrawModeNumberOfGet() {
  895.     ULONG  i;
  896.     STRPTR *sIndex=NULL;
  897.  
  898.     i=0;
  899.     sIndex=cDMNames;
  900.     while (sIndex[i]!=NULL) i++;
  901.     
  902.     return(i);
  903. }
  904.  
  905. /*
  906. TODO
  907.  
  908. Lightwave,Imagine,Videoscape  groessen/anzahl checks fertigmachen !!
  909.  
  910. Material mehr parameter, brechungsindex, reflektion, ...
  911.  
  912. */
  913.  
  914. /************************* End of file ******************************/
  915.  
  916.